Current File : /var/www/e360ban/wp-content/plugins/wp-shortcodes-usuarios/integraciones/woocommerce.php
<?php

/**
 * Datos de WooCommerce
 * copyright Enrique J. Ros - enrique@enriquejros.com
 *
 * @author 			Enrique J. Ros
 * @link 			https://www.enriquejros.com
 * @since 			1.0.0
 * @package 		WPShortcodesUsuarios
 *
 */

defined ('ABSPATH') or exit;

Class WP_Shortcodes_Usuarios_WooCommerce {

	public function __construct ($dato_shortcode, $user_id, $shortcode_id) {

		$this->resultado = false;

		switch ($dato_shortcode) {

			/***************************************
			 * DATOS DE FACTURACIÓN DE WOOCOMMERCE *
			 ***************************************/

			case 'datos_facturacion_woo':

				$cliente         = new WC_Customer($user_id);
				$estados         = WC()->countries->get_states();
				$this->resultado = sprintf ('%s %s<br>%s%s<br>%s%s<br>%s %s<br>%s (%s)',
					$cliente->get_billing_first_name(),
					$cliente->get_billing_last_name(),
					$cliente->get_billing_company(),
					($nif = get_user_meta ($user_id, 'nif', true)) ? '<br>' . $nif : '',
					$cliente->get_billing_address_1(),
					($dir2 = $cliente->get_billing_address_2()) ? '<br>' . $dir2 : '',
					$cliente->get_billing_postcode(),
					$cliente->get_billing_city(),
					$estados[$pais = $cliente->get_billing_country()][$cliente->get_billing_state()],
					WC()->countries->countries[$pais]
					);

				break;

			case 'billing_first_name':

				$cliente         = new WC_Customer($user_id);
				$this->resultado = $cliente->get_billing_first_name();
				break;

			case 'billing_last_name':

				$cliente         = new WC_Customer($user_id);
				$this->resultado = $cliente->get_billing_last_name();
				break;

			case 'billing_company':

				$cliente         = new WC_Customer($user_id);
				$this->resultado = $cliente->get_billing_company();
				break;

			case 'billing_nif':

				$this->resultado = get_user_meta ($user_id, 'nif', true);
				break;

			case 'billing_address_1':

				$cliente         = new WC_Customer($user_id);
				$this->resultado = $cliente->get_billing_address_1();
				break;

			case 'billing_address_2':

				$cliente         = new WC_Customer($user_id);
				$this->resultado = $cliente->get_billing_address_2();
				break;

			case 'billing_postcode':

				$cliente         = new WC_Customer($user_id);
				$this->resultado = $cliente->get_billing_postcode();
				break;

			case 'billing_city':

				$cliente         = new WC_Customer($user_id);
				$this->resultado = $cliente->get_billing_city();
				break;

			case 'billing_country':

				$cliente         = new WC_Customer($user_id);
				$this->resultado = WC()->countries->countries[$cliente->get_billing_country()];
				break;

			case 'billing_state':

				$cliente         = new WC_Customer($user_id);
				$estados         = WC()->countries->get_states();
				$this->resultado = $estados[$cliente->get_billing_country()][$cliente->get_billing_state()];
				break;

			case 'billing_phone':

				$cliente         = new WC_Customer($user_id);
				$this->resultado = $cliente->get_billing_phone();
				break;

			case 'billing_email':

				$cliente         = new WC_Customer($user_id);
				$this->resultado = $cliente->get_billing_email();
				break;

			/*********************************
			 * DATOS DE ENVÍO DE WOOCOMMERCE *
			 *********************************/

			case 'datos_envio_woo':

				$cliente         = new WC_Customer($user_id);
				$estados         = WC()->countries->get_states();
				$pais            = $cliente->get_shipping_country() ? : $cliente->get_billing_country();
				$state           = $cliente->get_shipping_state() ? : $cliente->get_billing_state();
				$this->resultado = sprintf ('%s %s<br>%s<br>%s%s<br>%s %s<br>%s (%s)',
					$cliente->get_shipping_first_name() ? : $cliente->get_billing_first_name(),
					$cliente->get_shipping_last_name() ? : $cliente->get_billing_last_name(),
					$cliente->get_shipping_company() ? : $cliente->get_billing_company(),
					($dir1s = $cliente->get_shipping_address_1()) ? $dir1s : $cliente->get_billing_address_1(),
					($dir1s && $dir2s = $cliente->get_shipping_address_2()) ? '<br>' . $dir2s : (($dir2b = $cliente->get_billing_address_2()) ? '<br>' . $dir2b : ''),
					$cliente->get_shipping_postcode() ? : $cliente->get_billing_postcode(),
					$cliente->get_shipping_city() ? : $cliente->get_billing_city(),
					isset ($estados[$pais][$state]) ? $estados[$pais][$state] : '',
					WC()->countries->countries[$pais]
					);

				break;

			case 'shipping_first_name':

				$cliente         = new WC_Customer($user_id);
				$this->resultado = $cliente->get_shipping_first_name();
				break;

			case 'shipping_last_name':

				$cliente         = new WC_Customer($user_id);
				$this->resultado = $cliente->get_shipping_last_name();
				break;

			case 'shipping_company':

				$cliente         = new WC_Customer($user_id);
				$this->resultado = $cliente->get_shipping_company();
				break;

			case 'shipping_address_1':

				$cliente         = new WC_Customer($user_id);
				$this->resultado = $cliente->get_shipping_address_1();
				break;

			case 'shipping_address_2':

				$cliente         = new WC_Customer($user_id);
				$this->resultado = $cliente->get_shipping_address_2();
				break;

			case 'shipping_postcode':

				$cliente         = new WC_Customer($user_id);
				$this->resultado = $cliente->get_shipping_postcode();
				break;

			case 'shipping_city':

				$cliente         = new WC_Customer($user_id);
				$this->resultado = $cliente->get_shipping_city();
				break;

			case 'shipping_country':

				$cliente         = new WC_Customer($user_id);
				$this->resultado = WC()->countries->countries[$cliente->get_shipping_country()];
				break;

			case 'shipping_state':

				$cliente         = new WC_Customer($user_id);
				$estados         = WC()->countries->get_states();
				$this->resultado = $estados[$cliente->get_shipping_country()][$cliente->get_shipping_state()];
				break;

			/***********************************
			 * DATOS DE COMPRAS DE WOOCOMMERCE *
			 ***********************************/

			case 'productos_comprados':

				$numero  = get_field ('numero', $shortcode_id);
				$quitar  = apply_filters ('wp_shortcodes_usuarios_quita_estados', ['wc-refunded', 'wc-failed', 'wc-cancelled'], $shortcode_id);
				$estados = wc_get_order_statuses();

				/**
				 * Si no queremos que se incluya un estado de pedido concreto (por ejemplo, En espera):
				 *
				 * add_filter ('wp_shortcodes_usuarios_quita_estados', function ($estados) {
				 *
				 *		$estados[] = 'wc-on-hold';
				 *		return $estados;
				 *		}, 10, 1);
				 *
				 */

				$pedidos = wc_get_orders (
					array(
						'customer_id' 	=> $user_id,
						'post_type'   	=> wc_get_order_types(),
						'post_status' 	=> array_diff (array_keys ($estados), $quitar),
						'numberposts'	=> -1,
						)
					);

				if (!$pedidos)
					break;

				$novalidos = get_posts ( //Quitamos los que están en la papelera o como borrador
					array(
						'numberposts' => -1,
						'meta_key'    => '_customer_user',
						'meta_value'  => $user_id,
						'post_type'   => wc_get_order_types(),
						'post_status' => ['trash', 'draft'],
						)
					);

				$novalidos_ids = wp_list_pluck ($novalidos, 'ID');

				foreach ($pedidos as $pedido)
					if (!in_array ($pedido->get_id(), $novalidos_ids))
						foreach ($pedido->get_items() as $item)
							$ids[] = $item->get_product_id();

				$ids = array_unique ($ids);

				if ($numero && count ($ids) > $numero) //Si lo hacemos con limit en la query puede poner duplicados
					$ids = array_slice ($ids, 0, $numero);

				$this->resultado = do_shortcode (sprintf ('[products ids="%s"]', implode ($ids, ',')));
				break;

			case 'numero_pedidos_woo':

				$quitar   = apply_filters ('wp_shortcodes_usuarios_quita_estados', ['wc-refunded', 'wc-failed', 'wc-cancelled'], $shortcode_id);
				$estados  = wc_get_order_statuses();

				/**
				 * Si no queremos que se incluya un estado de pedido concreto (por ejemplo, En espera):
				 *
				 * add_filter ('wp_shortcodes_usuarios_quita_estados', function ($estados) {
				 *
				 *		$estados[] = 'wc-on-hold';
				 *		return $estados;
				 *		}, 10, 1);
				 *
				 */

				$pedidos = get_posts (
					array(
						'numberposts' => -1,
						'meta_key'    => '_customer_user',
						'meta_value'  => $user_id,
						'post_type'   => wc_get_order_types(),
						'post_status' => array_diff (array_keys ($estados), $quitar),
						)
					);

				$this->resultado = count ($pedidos);
				break;

			case 'total_gastado_woo':

				$cantidad = wc_get_customer_total_spent ($user_id);
				$formato  = apply_filters ('wp_shortcodes_usuarios_formato_cantidad', true, $shortcode_id);

				/**
				 * Si queremos obtener la cantidad numérica, sin formato:
				 *
				 * add_filter ('wp_shortcodes_usuarios_formato_cantidad', '__return_false');
				 *
				 */

				$this->resultado = $formato ? wc_price ($cantidad) : $cantidad;
				break;

			case 'pedido_minimo':

				global $wp_roles;

				$datos  = get_userdata ($user_id);
				$rol    = $datos->roles[0];
				$minimo = (($minimos = get_option ('ejr_minimos_pedido')) && isset ($minimos[$rol])) ? $minimos[$rol] : get_option ('ejr_minimo_' . $rol);
				$cero   = apply_filters ('wp_shortcodes_usuarios_sin_minimo', wc_price (0), $shortcode_id);

				/**
				 * Para mostrar un texto cuando el rol del usuario no tiene mínimo de compra:
				 *
				 * add_filter ('wp_shortcodes_usuarios_sin_minimo', function ($texto) {
				 *
				 *		return 'Texto a mostrar si no hay pedido mínimo';
				 *		}, 10, 1);
				 *
				 */

				$this->resultado = $minimo ? wc_price ($minimo) : $cero;
				break;

			case 'tabla_pedidos':

				$mensaje   = sprintf ('<div class="woocommerce-message woocommerce-message--info woocommerce-Message woocommerce-Message--info woocommerce-info"><a class="woocommerce-Button button" href="%s">%s</a>No se ha hecho ningún pedido todavía.</div>', get_permalink (wc_get_page_id ('shop')), __('Browse products', 'woocommerce'), __('No order has been made yet.', 'woocommerce'));
				$nopedidos = apply_filters ('wp_shortcodes_usuarios_no_pedidos', $mensaje, $shortcode_id);

				/**
				 * Para mostrar un texto cuando el usuario no tiene pedidos:
				 *
				 * add_filter ('wp_shortcodes_usuarios_no_pedidos', function ($texto) {
				 *
				 *		return 'Texto a mostrar si no hay pedidos';
				 *		}, 10, 1);
				 *
				 */

				if (!$pedidos = get_posts (
					array(
						'numberposts'	=> -1,
						'meta_key'		=> '_customer_user',
						'meta_value'	=> $user_id,
						'order_by'		=> 'date',
						'order'			=> 'DESC',
						'post_type'		=> wc_get_order_types(),
						'post_status'	=> array_keys (wc_get_order_statuses()),
						)
					)) {

					$this->resultado = $nopedidos;
					break;
					}

				$this->resultado = sprintf ('<table class="woocommerce-orders-table woocommerce-MyAccount-orders shop_table shop_table_responsive my_account_orders account-orders-table wp-shortcodes-pedidos-tabla">
					<thead>
						<tr>
							<th class="woocommerce-orders-table__header woocommerce-orders-table__header-order-number"><span class="nobr">%s</span></th>
							<th class="woocommerce-orders-table__header woocommerce-orders-table__header-order-date"><span class="nobr">%s</span></th>
							<th class="woocommerce-orders-table__header woocommerce-orders-table__header-order-status"><span class="nobr">%s</span></th>
							<th class="woocommerce-orders-table__header woocommerce-orders-table__header-order-total"><span class="nobr">%s</span></th>
							<th class="woocommerce-orders-table__header woocommerce-orders-table__header-order-actions"><span class="nobr">%s</span></th>
						</tr>
					</thead>
					<tbody>', __('Order', 'woocommerce'), __('Date', 'woocommerce'), __('Status', 'woocommerce'), __('Total', 'woocommerce'), __('Actions', 'woocommerce'));

				//Si usamos numberposts y ordenamos DESC salen los más antiguos
				$limite = get_field ('numero', $shortcode_id);

				if ($limite && count ($pedidos) > $limite)
					$pedidos = array_slice ($pedidos, 0, $limite);

				/**
				 * Si queremos que la lista esté ordenada con los más antiguos primero:
				 *
				 * add_filter ('wp_shortcodes_usuarios_pedidos_descendentes', '__return_true');
				 *
				 */

				if ($ordenar = apply_filters ('wp_shortcodes_usuarios_pedidos_descendentes', false, $shortcode_id))
					$pedidos = array_reverse ($pedidos);

				foreach ($pedidos as $pedido) {

					$order    = new WC_Order($pedido->ID);
					$items    = $order->get_item_count();
					$acciones = '';

					foreach (wc_get_account_orders_actions ($order) as $key => $accion)
						$acciones .= sprintf ('<a href="%s" class="woocommerce-button button %s">%s</a>', $accion['url'], $key, $accion['name']);

					$this->resultado .= sprintf ('
						<tr class="woocommerce-orders-table__row order">
							<td class="woocommerce-orders-table__cell woocommerce-orders-table__cell-order-number" data-title="%s">
								<a href="%s">#%s</a>
							</td>
							<td class="woocommerce-orders-table__cell woocommerce-orders-table__cell-order-date" data-title="%s">
								<time datetime="%s">%s</time>
							</td>
							<td class="woocommerce-orders-table__cell woocommerce-orders-table__cell-order-status" data-title="%s">%s</td>
							<td class="woocommerce-orders-table__cell woocommerce-orders-table__cell-order-total" data-title="%s">%s</td>
							<td class="woocommerce-orders-table__cell woocommerce-orders-table__cell-order-actions" data-title="%s">%s</td>
						</tr>',
						__('Order', 'woocommerce'),
						$order->get_view_order_url(),
						$pedido->ID,
						__('Date', 'woocommerce'),
						$pedido->post_date,
						date_i18n (get_option ('date_format'), strtotime ($pedido->post_date)),
						__('Status', 'woocommerce'),
						wc_get_order_status_name ($order->get_status()),
						__('Total', 'woocommerce'),
						sprintf (_n('%1$s for %2$s item', '%1$s for %2$s items', $items, 'woocommerce'), wc_price ($order->get_total()), $items),
						__('Actions', 'woocommerce'),
						$acciones
						);
					}

				$this->resultado .= '</tbody></table>';
				break;

			case 'tabla_descargas':

				$aviso       = sprintf ('<div class="woocommerce-Message woocommerce-Message--info woocommerce-info"><a class="woocommerce-Button button" href="%s">%s</a>%s</div>', get_permalink (wc_get_page_id ('shop')), __('Browse products', 'woocommerce'), __('No downloads available yet.', 'woocommerce'));
				$nodescargas = apply_filters ('wp_shortcodes_usuarios_no_descargas', $aviso, $shortcode_id);

				/**
				 * Para mostrar un texto cuando no hay descargas para el usuario:
				 *
				 * add_filter ('wp_shortcodes_usuarios_no_descargas', function ($texto) {
				 *
				 *		return 'Texto a mostrar si no hay descargas';
				 *		}, 10, 1);
				 *
				 */

				if (!$descargas = wc_get_customer_available_downloads ($user_id)) {

					$this->resultado = $nodescargas;
					break;
					}

				$this->resultado = sprintf ('<table class="woocommerce-table woocommerce-table--order-downloads shop_table shop_table_responsive order_details wp-shortcodes-descargas-tabla">
					<thead>
						<tr>
							<th class="download-product"><span class="nobr">%s</span></th>
							<th class="download-remaining"><span class="nobr">%s</span></th>
							<th class="download-expires"><span class="nobr">%s</span></th>
							<th class="download-file"><span class="nobr">%s</span></th>
						</tr>
					</thead>
					<tbody>', __('Product', 'woocommerce'), __('Downloads remaining', 'woocommerce'), __('Expires', 'woocommerce'), __('Download', 'woocommerce'));

				foreach ($descargas as $descarga)
					$this->resultado .= sprintf ('
						<tr>
							<td class="download-product wp-shortcodes-descarga-producto" data-title="%s">
								<a href="%s">%s</a>
							</td>
							<td class="download-remaining wp-shortcodes-descarga-restantes" data-title="%s">%s</td>
							<td class="download-expires wp-shortcodes-descarga-expira" data-title="%s">%s</td>
							<td class="download-file wp-shortcodes-descarga-archivo" data-title="%s">
								<a href="%s" class="woocommerce-MyAccount-downloads-file button alt wp-shortcodes-descarga-boton">%s</a>
							</td>
						</tr>',
						__('Product', 'woocommerce'),
						$descarga['product_url'],
						$descarga['product_name'],
						__('Downloads remaining', 'woocommerce'),
						$descarga['downloads_remaining'] ? : '∞',
						__('Expires', 'woocommerce'),
						isset ($descarga['access_expires']) ? date_i18n (get_option ('date_format'), strtotime ($descarga['access_expires'])) : __('Never', 'woocommerce'),
						__('Download', 'woocommerce'),
						$descarga['download_url'],
						$descarga['download_name']
						);

				$this->resultado .= '</tbody></table>';
				break;

			case 'tabla_cupones':

				global $wpdb;

				$datos = get_userdata ($user_id);
				$query = "SELECT {$wpdb->prefix}postmeta.post_id FROM {$wpdb->prefix}postmeta WHERE {$wpdb->prefix}postmeta.meta_key LIKE 'customer_email' AND {$wpdb->prefix}postmeta.meta_value LIKE '%{$datos->user_email}%'";

				$nocupones = apply_filters ('wp_shortcodes_usuarios_no_cupones', false, $shortcode_id);

				/**
				 * Para mostrar un texto cuando no hay cupones específicos para el usuario:
				 *
				 * add_filter ('wp_shortcodes_usuarios_no_cupones', function ($texto) {
				 *
				 *		return 'Texto a mostrar si no hay cupones';
				 *		}, 10, 1);
				 *
				 */

				if (!$cupones = $wpdb->get_results($query)) {

					$this->resultado = $nocupones;
					break;
					}

				$this->resultado = sprintf ('<table class="woocommerce-table woocommerce-table--order-downloads shop_table shop_table_responsive order_details wp-shortcodes-cupones-tabla">
					<thead>
						<tr>
							<th class="wp-shortcodes-cupones-codigo"><span class="nobr">%s</span></th>
							<th class="wp-shortcodes-cupones-descripcion"><span class="nobr">%s</span></th>
							<th class="wp-shortcodes-cupones-descuento"><span class="nobr">%s</span></th>
							<th class="wp-shortcodes-cupones-usos"><span class="nobr">%s</span></th>
						</tr>
					</thead>
					<tbody>', __('Code', 'woocommerce'), __('Description', 'woocommerce'), __('Descuento', 'wp-shortcodes-usuario'), __('Usos restantes', 'wp-shortcodes-usuario'));

				foreach ($cupones as $cupon) {

					$cantidad = get_post_meta ($cupon->post_id, 'coupon_amount', true);

					if ('fixed_cart' == ($tipo = get_post_meta ($cupon->post_id, 'discount_type', true)) || 'fixed_product' == $tipo)
						$descuento = wc_price ($cantidad);

					else if ('percent' == $tipo)
						$descuento = $cantidad . '%';

					$limite_cupon     = get_post_meta ($cupon->post_id, 'usage_limit', true) ? : 0;
					$limite_usuario   = get_post_meta ($cupon->post_id, 'usage_limit_per_user', true) ? : 0;
					$limite           = ($limite_cupon || $limite_usuario) ? min ([$limite_cupon, $limite_usuario]) - get_post_meta ($cupon->post_id, 'usage_count', true) : '∞';
					$post             = get_post ($cupon->post_id);
					$this->resultado .= sprintf ('
						<tr>
							<td class="wp-shortcodes-cupones-codigo" data-title="%s">%s</td>
							<td class="wp-shortcodes-cupones-restantes" data-title="%s">%s</td>
							<td class="wp-shortcodes-cupones-expira" data-title="%s">%s</td>
							<td class="wp-shortcodes-cupones-archivo" data-title="%s">%s</td>
						</tr>',
						__('Code', 'woocommerce'),
						$post->post_title,
						__('Description', 'woocommerce'),
						$post->post_excerpt,
						__('Descuento', 'wp-shortcodes-usuario'),
						$descuento,
						__('Usos restantes', 'wp-shortcodes-usuario'),
						$limite
						);
					}

				$this->resultado .= '</tbody></table>';
				break;
			}

		return $this->resultado;
		}

	}
Page Not Found
Parece que el enlace que apuntaba aquí no sirve. ¿Quieres probar con una búsqueda?
¡Hola!